from wtforms import StringField, SubmitField
from wtforms.fields.simple import TextAreaField
from wtforms.validators import DataRequired, Length, Email, Regexp
from flask_wtf import FlaskForm
from wtforms.widgets.core import TextArea
from wtforms import StringField, TextAreaField, BooleanField, SelectField,\
    SubmitField, ValidationError
from ..models import Role, User, PostType
from flask_pagedown.fields import PageDownField


class setForm(FlaskForm):
    name = StringField('What is your name?', validators=[DataRequired()])
    submit = SubmitField('Submit')


class EditProfileForm(FlaskForm):
    name = StringField('Real name', validators=[Length(0, 64)])
    location = StringField('Location', validators=[Length(0, 64)])
    about_me = TextAreaField('About me')
    submit = SubmitField("Submit")


class EditProfileAdminForm(FlaskForm):
    email = StringField('Email', validators=[DataRequired(), Length(1, 64),
                                             Email()])
    username = StringField('Username', validators=[
        DataRequired(), Length(1, 64), Regexp('^[A-Za-z][A-Za-z0-9_.]*$', 0,
                                              'Usernames must have only letters, '
                                              'numbers, dots or underscores')])
    confirmed = BooleanField('Confirmed')
    role = SelectField('Role', coerce=int)
    name = StringField('Real name', validators=[Length(0, 64)])
    location = StringField('Location', validators=[Length(0, 64)])
    about_me = TextAreaField('About me')
    submit = SubmitField('Submit')

    def __init__(self, user, *args, **kwargs):
        super(EditProfileAdminForm, self).__init__(*args, **kwargs)
        self.role.choices = [(role.id, role.name)
                             for role in Role.query.order_by(Role.name).all()]  # 选择用户
        self.user = user

    def validate_email(self, field):  # 验证邮箱是否存在
        if field.data != self.user.email and \
                User.query.filter_by(email=field.data).first():
            raise ValidationError('Email already registered.')

    def validate_username(self, field):  # 验证用户名是否已经存在
        if field.data != self.user.username and \
                User.query.filter_by(username=field.data).first():
            raise ValidationError('Username already in use.')


class PostForm(FlaskForm):
    title = StringField('标题', [DataRequired(), Length(max=255)])
    posttype = SelectField('PostType', coerce=int)
    content = TextAreaField('博文', [DataRequired()])
    submit = SubmitField("提交")

    def __init__(self, *args, **kwargs):
        super(PostForm, self).__init__(*args, **kwargs)
        self.posttype.choices = [('0', '暂不归档')]+[(posttype.id, posttype.name)
                                                 for posttype in PostType.query.order_by(PostType.create_at.
                                                 desc()).all()]  # 选择用户
        # self.user = user
        # self.posttype.choices = self.posttype.choices + [('q0', '暂不归档')]


class SearchPosts(FlaskForm):
    content = StringField('博文内容或者标题', [DataRequired(), Length(max=255)])
    submit = SubmitField("搜索")


class PostTypeForm(FlaskForm):
    name = StringField('博文分类名', [DataRequired(), Length(max=64)])
    explain = TextAreaField('简介', [DataRequired(), Length(max=255)])
    submit = SubmitField('创建')
